/**
 * <h3>OpusMapper</h3>
 * <p> 接口名：OpusMapper</p>
 *
 * <h3>功能描述</h3>
 * <p> 作品信息的数据访问层接口，定义了对作品表的增删改查操作方法。</p>
 * <p> 该接口继承自 MyBatis Plus 的 BaseMapper，扩展了基于业务需求的自定义查询方法。</p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li> 作者：郭强 </li>
 *    <li> 创建日期：2025年05月06日 21:22:53 </li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li> 示例代码：{@code @Autowired private OpusMapper opusMapper;}</li>
 * </ul>
 *
 * @implSpec 实现了 MyBatis Plus 的 {@link BaseMapper} 接口，并扩展了作品相关的业务方法。
 * @since 1.0.0
 */
package com.dnndo.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dnndo.system.domain.Opus;
import com.dnndo.system.domain.OpuslistsToUserInfo;
import com.dnndo.system.domain.dto.*;
import com.dnndo.system.domain.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 作品数据访问层接口
 */
@Mapper
public interface OpusMapper extends BaseMapper<OpusDTO> {

    /**
     * 查询所有或符合条件的作品列表
     * @param dto 封装查询条件的 Opus 对象
     * @return List<Opus> 符合条件的作品信息列表
     * @see Opus
     */
    List<Opus> selectOpusList(OpusDTO dto);
    /**
     * 查询学校相关作品列表
     * @param dto 封装查询条件的 OpusDTO 对象（可能包含学校筛选条件）
     * @return List<Opus> 符合条件的学校作品信息列表
     * @see Opus
     */
    List<Opus> selectSchoolOpusList(OpusDTO dto);

    /**
     * 根据用户ID查询作品列表
     * @param dto 包含用户ID查询条件的 OpusDTO 对象
     * @return List<Opus> 指定用户的作品信息列表
     * @see Opus
     */
    List<Opus> selectOpusListByUserId(OpusDTO dto);

    /**
     * 查询设计师列表
     * @param dto 封装查询条件的 Opus 对象
     * @return List<Opus> 符合条件的作品信息列表
     * @see Opus
     */
    List<OpusDTO> selectdesignerlist(OpusDTO dto);

    /**
     * 查询学院设计师列表
     * @param dto 封装查询条件的 Opus 对象
     * @return List<Opus> 符合条件的作品信息列表
     * @see Opus
     */
    List<OpusDTO> selectSchoolDesignerList(OpusDTO dto);

    /**
     * 根据作品ID查询作品详细信息
     * @param opusId 作品唯一标识符
     * @return OpusDTO 作品实体对象
     * @see OpusDTO
     */
    OpusDTO selectOpusListById(Long opusId);

    /**
     * 根据用户ID查询作品详细信息
     *
     * @param UserId 作品唯一标识符
     * @return HashMap<String, Object> 作品实体对象
     * @see OpusDTO
     */
    OpusDTO selectdesignerListById(Long UserId);

    /**
     * 根据作品ID更新作品信息
     * @param opus 封装更新数据的 Opus 对象
     * @return int 受影响的记录数（通常为1）
     * @see OpusDTO
     */
    int updateOpusById(OpusDTO opus);

    /**
     * 新增一条作品记录
     * @param opus 封装新增数据的 Opus 对象
     * @return int 受影响的记录数（通常为1）
     * @see OpusDTO
     */
    int insertOpus(OpusDTO opus);

    /**
     * 根据作品ID删除作品记录
     * @param opusId 作品唯一标识符
     * @return int 受受影响的记录数（通常为1）
     * @see OpusDTO
     */
    int deleteOpusById(Integer opusId);

    int delOpusById(Integer opusId);

    /**
     * 查询校园品牌馆信息(中文)
     * @param dto 查询条件封装对象
     * @return List<Map<String, Object>> 查询结果集
     */
    List<BrandPavilionDTO> selectCampusBrandPavilionZh(BrandPavilionDTO dto);

    /**
     * 查询校园品牌馆信息(英文)
     * @param dto 查询条件封装对象
     * @return List<Map<String, Object>> 查询结果集
     */
    List<BrandPavilionDTO> selectCampusBrandPavilionEn(BrandPavilionDTO dto);


    //获取校园大使（添加英文版方法）
    List<AmbassadorVOZH> ambassador();
    List<AmbassadorVOEN> ambassadorEn();  // 新增英文版大使查询方法

    //获取校园设计师
    List<DesignerDTO> designer();
    List<DesignerDTO> designerEn();

    //文创活动-根据作品id，查询相关作品及用户信息
    CulturalDTO cultural(Integer opusId);
    CulturalDTO culturalEn(Integer opusId);

    //  根据用户id，查询该用户的所有相关作品  中文
    List<OpuslistWithUserInfoDTO> selectOpusListWithUserInfoZh(Integer userId);

    //    根据用户id，查询该用户的所有相关作品  英文
    List<OpuslistWithUserInfoDTO> selectOpusListWithUserInfoEn(Integer userId);
    //    首页-文创活动
    ApiOpusDTO selectApiOpusActivities();

    int checkUserJoined(@Param("themeId") Long themeId, @Param("userId") Long userId);

    OpusDTO selectOpusById(Long opusId);

//    查询大赛的所有作品
    List<OpusDTO> selectOpusByThemeId(Integer themeId);

    //  查询校园品牌馆信息的总记录数
    int countCampusBrandPavilionZh(BrandPavilionDTO dto);
    int countCampusBrandPavilionEn(BrandPavilionDTO dto);

    //  查询校园品牌馆信息的总记录数
    int countAmbassador(AmbassadorDTO dto);

    //  查询设计师的总记录数
    int countDesigner(DesignerDTO dto);

    //  查询根据用户id，查询该用户的所有相关作品总数
    int countWorkListWithUserInfo(OpuslistWithUserInfoDTO dto);

  List<OpuslistsToUserInfo> getOpusListsByUserId(OpuslistsToUserInfo opuslistsToUserInfo);

}
